home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / progtool / c / egem_210 / egem / source / graf.c < prev    next >
C/C++ Source or Header  |  1995-11-25  |  10KB  |  476 lines

  1.  
  2. #include "proto.h"
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. int _no_button = 0;
  7.  
  8. static void draw_rubber(int *);
  9.  
  10. static int mouse_index;
  11. static long last_mouse;
  12.  
  13. static MFORM mouse_form[4] = {
  14. { 7,7,1,0,1,
  15.   {0x03C0, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7FFE, 0xFFFF, 0xFFFF, 
  16.    0xFFFF, 0xFFFF, 0x7FFE, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0x03C0},
  17.   {0x0000, 0x03C0, 0x0CF0, 0x10F8, 0x20FC, 0x20FC, 0x40FE, 0x40FE, 
  18.    0x7F02, 0x7F02, 0x3F04, 0x3F04, 0x1F08, 0x0F30, 0x03C0, 0x0000}},
  19. { 7,7,1,0,1,
  20.   {0x03C0, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7FFE, 0xFFFF, 0xFFFF, 
  21.    0xFFFF, 0xFFFF, 0x7FFE, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0x03C0},
  22.   {0x0000, 0x03C0, 0x0C30, 0x1008, 0x381C, 0x3C3C, 0x7E7E, 0x7FFE, 
  23.    0x7FFE, 0x7E7E, 0x3C3C, 0x381C, 0x1008, 0x0C30, 0x03C0, 0x0000}},
  24. { 7,7,1,0,1,
  25.   {0x03C0, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7FFE, 0xFFFF, 0xFFFF, 
  26.    0xFFFF, 0xFFFF, 0x7FFE, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0x03C0},
  27.   {0x0000, 0x03C0, 0x0F30, 0x1F08, 0x3F04, 0x3F04, 0x7F02, 0x7F02, 
  28.    0x40FE, 0x40FE, 0x20FC, 0x20FC, 0x10F8, 0x0CF0, 0x03C0, 0x0000}},
  29. { 7,7,1,0,1,
  30.   {0x03C0, 0x0FF0, 0x1FF8, 0x3FFC, 0x7FFE, 0x7FFE, 0xFFFF, 0xFFFF, 
  31.    0xFFFF, 0xFFFF, 0x7FFE, 0x7FFE, 0x3FFC, 0x1FF8, 0x0FF0, 0x03C0},
  32.   {0x0000, 0x03C0, 0x0FF0, 0x1FF8, 0x2FF4, 0x27E4, 0x43C2, 0x4182, 
  33.    0x4182, 0x43C2, 0x27E4, 0x2FF4, 0x1FF8, 0x0FF0, 0x03C0, 0x0000}}};
  34.  
  35. void graf_busy_mouse(void)
  36. {
  37.     long time;
  38.  
  39.     if (((time=clock())-last_mouse)<20)
  40.         return;
  41.  
  42.     last_mouse = time;
  43.     graf_mouse(USER_DEF,&mouse_form[mouse_index++]);
  44.     mouse_index &= 3;
  45. }
  46.  
  47. void graf_rt_slidebox(SLINFO *sl,int obj,int double_click)
  48. {
  49.     XEVENT event;
  50.     reg DIAINFO *info = sl->sl_info;
  51.     reg OBJECT *ptree = info->di_tree;
  52.     reg OBJECT *ob_ptr = ptree+sl->sl_slider,*par_ptr = ptree+sl->sl_parent;
  53.     reg int pos,prev,max_pos,max_val;
  54.     reg long y;
  55.     int    top,start_x,start_y,delta,flag = FALSE,count,index,offset = 0;
  56.     boolean sl_mode;
  57.     GRECT par;
  58.  
  59.     if (info->di_flag==CLOSED || info->di_win->iconified)
  60.         return;
  61.  
  62.     if (info->di_flag>=WINDOW)
  63.     {
  64.         GRECT work;
  65.  
  66.         window_first(info->di_win,&work);
  67.         if (work.g_w>0 && work.g_h>0)
  68.             top = rc_equal(&info->di_win->work,&work);
  69.         else
  70.             return;
  71.     }
  72.     else
  73.         top = TRUE;
  74.  
  75.     start_x = ob_ptr->ob_x;
  76.     start_y = ob_ptr->ob_y;
  77.  
  78.     max_val = max(sl->sl_max - sl->sl_page,0);
  79.     delta = max(sl->sl_page - 1,1);
  80.  
  81.     objc_offset(ptree,sl->sl_parent,&par.g_x,&par.g_y);
  82.     par.g_w = par_ptr->ob_width;
  83.     par.g_h = par_ptr->ob_height;
  84.  
  85.     if (sl->sl_vh)
  86.         max_pos = par_ptr->ob_height - ob_ptr->ob_height;
  87.     else
  88.         max_pos = par_ptr->ob_width - ob_ptr->ob_width;
  89.  
  90.     if (obj<0)
  91.     {
  92.         prev = pos = sl->sl_pos;
  93.  
  94.         switch (obj)
  95.         {
  96.         case SL_UP:
  97.             pos--;
  98.             break;            
  99.         case SL_DOWN:
  100.             pos++;
  101.             break;
  102.         case SL_PG_UP:
  103.             pos -= delta;
  104.             break;
  105.         case SL_PG_DN:
  106.             pos += delta;
  107.             break;
  108.         case SL_START:
  109.             pos = 0;
  110.             break;
  111.         case SL_END:
  112.             pos = max_val;
  113.             break;
  114.         default:
  115.             return;
  116.         }
  117.  
  118.         goto _set_slider;
  119.     }
  120.     else if (obj==sl->sl_dec || obj==sl->sl_inc)
  121.     {
  122.         sl_mode = TRUE;
  123.         count = index = 0;
  124.         if (obj==sl->sl_dec)
  125.             sl->sl_dec = FAIL;
  126.         else
  127.             sl->sl_inc = FAIL;
  128.     }
  129.     else if (obj==sl->sl_slider)
  130.     {
  131.         _mouse_pos(&event.ev_mm1x, &event.ev_mm1y);
  132.         start_x -= event.ev_mm1x;
  133.         start_y -= event.ev_mm1y;
  134.         sl_mode = FAIL;
  135.         double_click = 0;
  136.     }
  137.     else
  138.     {
  139.         _mouse_pos(&start_x, &start_y);
  140.         sl_mode = FALSE;
  141.         double_click = 0;
  142.     }
  143.  
  144.     _beg_ctrl();
  145.  
  146.     memset(&event,0,sizeof(XEVENT));
  147.     event.ev_mflags    = MU_BUTTON|MU_TIMER;
  148.     event.ev_mbmask = 3;
  149.     event.ev_mbclicks = 1;
  150.     event.ev_mtlocount = sl->sl_speed;
  151.  
  152.     if (sl_mode==TRUE)
  153.         ob_select(info,ptree,obj,SET_STATE,TRUE);
  154.     else if (sl_mode==FALSE)
  155.     {
  156.         if (sl->sl_vh)
  157.         {
  158.             if (start_y<par.g_y + ob_ptr->ob_y)
  159.                 delta = -delta;
  160.         }
  161.         else if (start_x<(par.g_x+ob_ptr->ob_x))
  162.             delta = -delta;
  163.     }
  164.     else
  165.     {
  166.         event.ev_mflags = MU_BUTTON|MU_M1;
  167.         event.ev_mm1flags = event.ev_mm1width = event.ev_mm1height = 1;
  168.  
  169.         MouseFlatHand();
  170.     }
  171.  
  172.     if (sl_mode>=FALSE)
  173.         Event_Timer(sl->sl_delay,0);
  174.  
  175.     do
  176.     {
  177.         if (sl_mode>=FALSE && sl->sl_mode==SL_LOG)
  178.         {
  179.             count++;
  180.             event.ev_mtlocount = sl->sl_speed/count;
  181.         }
  182.  
  183.         _no_button++;
  184.         flag = Event_Multi(&event) & MU_BUTTON;
  185.         _no_button--;
  186.  
  187.         event.ev_mm1x = event.ev_mmox;
  188.         event.ev_mm1y = event.ev_mmoy;
  189.  
  190.         if (max_pos>0)
  191.         {
  192.             prev = sl->sl_pos;
  193.  
  194.             if (sl_mode==TRUE)
  195.             {
  196.                 if (double_click)
  197.                 {
  198.                     if (sl->sl_dec<0)
  199.                         pos = 0;
  200.                     else
  201.                         pos = max_val;
  202.                     flag = TRUE;
  203.                 }
  204.                 else
  205.                 {
  206.                     switch (sl->sl_mode)
  207.                     {
  208.                     case SL_EXP:
  209.                         offset += ++index;
  210.                         break;
  211.                     case SL_LOG:
  212.                         offset = ++index;
  213.                         break;
  214.                     case SL_STEP:
  215.                         flag = TRUE;
  216.                     default:
  217.                         offset = 1;
  218.                     }
  219.  
  220.                     if (sl->sl_dec<0)
  221.                         pos = prev - offset;
  222.                     else
  223.                         pos = prev + offset;
  224.  
  225.                     if (pos<0 || pos>max_val)
  226.                         flag = TRUE;
  227.                 }
  228.             }
  229.             else if (sl_mode==FAIL)
  230.             {
  231.                 if (sl->sl_vh)
  232.                     pos = start_y + event.ev_mm1y;
  233.                 else
  234.                     pos = start_x + event.ev_mm1x;
  235.                 y = pos; y *= max_val; y /= max_pos;
  236.                 pos = (int) y;
  237.             }
  238.             else
  239.                 pos = prev + delta;
  240.  
  241.             _set_slider:
  242.             pos = min(max(pos,0),max_val);
  243.  
  244.             if (pos!=prev)
  245.             {
  246.                 reg GRECT area = par;
  247.                 reg int dif,n_pos,n_prev;
  248.  
  249.                 sl->sl_pos = pos;
  250.  
  251.                 y = pos;y *= max_pos;y /= max_val;
  252.                 n_pos = (int) y;
  253.  
  254.                 y = prev;y *= max_pos;y /= max_val;
  255.                 n_prev = (int) y;
  256.  
  257.                 dif = (n_pos < n_prev) ? (n_prev - n_pos + 1) : (n_pos - n_prev + 1);
  258.  
  259.                 if (sl->sl_vh)
  260.                 {
  261.                     area.g_h = dif;
  262.                     if (n_pos<n_prev)
  263.                         area.g_y += n_pos + ob_ptr->ob_height;
  264.                     else
  265.                         area.g_y += n_prev - 1;
  266.                     ob_ptr->ob_y = n_pos;
  267.                 }
  268.                 else
  269.                 {
  270.                     area.g_w = dif;
  271.                     if (n_pos<n_prev)
  272.                         area.g_x += n_pos + ob_ptr->ob_width;
  273.                     else
  274.                         area.g_x += n_prev - 1;
  275.                     ob_ptr->ob_x = n_pos;
  276.                 }
  277.  
  278.                 if (sl->sl_do)
  279.                     sl->sl_do(ob_ptr,pos,prev,max_val,top);
  280.  
  281.                 ob_draw_chg(info,sl->sl_slider,NULL,FAIL,top);
  282.                 ob_draw_chg(info,sl->sl_parent,&area,FAIL,top);
  283.  
  284.                 graf_set_slider(sl,ptree,GRAF_SET_ARROWS|GRAF_DRAW_SLIDER);
  285.             }
  286.  
  287.             if (obj<0)
  288.                 return;
  289.         }
  290.     } while (flag==FALSE);
  291.  
  292.     if (sl_mode==TRUE)
  293.     {
  294.         if (sl->sl_dec<0)
  295.             sl->sl_dec = obj;
  296.         else
  297.             sl->sl_inc = obj;
  298.         ob_select(info,ptree,obj,CLEAR_STATE,TRUE);
  299.         graf_set_slider(sl,ptree,GRAF_SET_ARROWS|GRAF_DRAW_SLIDER);
  300.     }
  301.     else
  302.         MouseArrow();
  303.  
  304.     _no_click();
  305.     _end_ctrl();
  306. }
  307.  
  308. void graf_arrows(SLINFO *sl,OBJECT *tree,int show)
  309. {
  310.     graf_set_slider(sl,tree,(show) ? (GRAF_SET_ARROWS|GRAF_DRAW_SLIDER) : GRAF_SET_ARROWS);
  311. }
  312.  
  313. void graf_set_slider(SLINFO *sl,OBJECT *tree,int show)
  314. {
  315.     if (show & GRAF_SET_SIZE_POS)
  316.     {
  317.         reg OBJECT *ob_ptr,*par_ptr;
  318.         reg long y = sl->sl_pos,size;
  319.         reg int vh = sl->sl_vh,max_val = sl->sl_max - sl->sl_page;
  320.  
  321.         par_ptr = tree+sl->sl_parent;
  322.         ob_ptr = tree+sl->sl_slider;
  323.  
  324.         if (sl->sl_page>1)
  325.         {
  326.             size = (vh==VERT_SLIDER) ? par_ptr->ob_height : par_ptr->ob_width;
  327.  
  328.             if (max_val>0)
  329.             {
  330.                 size *= sl->sl_page;
  331.                 size /= sl->sl_max;
  332.             }
  333.             else if (vh==VERT_SLIDER)
  334.                 ob_ptr->ob_y = 0;
  335.             else
  336.                 ob_ptr->ob_x = 0;
  337.         }
  338.         else
  339.             size = (vh==VERT_SLIDER) ? ob_ptr->ob_height : ob_ptr->ob_width;
  340.  
  341.         if (size<gr_ch)
  342.             size = gr_ch;
  343.  
  344.         if (vh==VERT_SLIDER)
  345.         {
  346.             ob_ptr->ob_height = (int) size;
  347.  
  348.             if (max_val>0)
  349.             {
  350.                 y *= (par_ptr->ob_height - (int) size);
  351.                 y /= max_val;
  352.                 ob_ptr->ob_y = (int) y;
  353.             }
  354.         }
  355.         else
  356.         {
  357.             ob_ptr->ob_width = (int) size;
  358.  
  359.             if (max_val>0)
  360.             {
  361.                 y *= (par_ptr->ob_width - (int) size);
  362.                 y /= max_val;
  363.                 ob_ptr->ob_x = (int) y;
  364.             }
  365.         }
  366.  
  367.         if (show & GRAF_DRAW_SLIDER)
  368.             ob_draw(sl->sl_info,sl->sl_parent);
  369.     }
  370.  
  371.     if (show & GRAF_SET_ARROWS)
  372.     {
  373.         show &= GRAF_DRAW_SLIDER;
  374.  
  375.         if (sl->sl_dec>0)
  376.             ob_disable(sl->sl_info,tree,sl->sl_dec,(sl->sl_pos>0) ? CLEAR_STATE : SET_STATE,show);
  377.  
  378.         if (sl->sl_inc>0)
  379.             ob_disable(sl->sl_info,tree,sl->sl_inc,(sl->sl_pos<(sl->sl_max-sl->sl_page)) ? CLEAR_STATE : SET_STATE,show);
  380.     }
  381. }
  382.  
  383. int graf_rt_rubberbox(int s_x,int s_y,GRECT *rect,int *r_w,int *r_h,void (*call_func)(int *new_rect))
  384. {
  385.     XEVENT event;
  386.     reg int pxy[4],rect_xy[4];
  387.     reg int events,max_1,max_2,dif;
  388.  
  389.     if (!rc_inside(s_x,s_y,rect))
  390.         return(FALSE);
  391.  
  392.     rc_grect_to_array(rect,rect_xy);
  393.  
  394.     pxy[0] = s_x;
  395.     pxy[1] = s_y;
  396.  
  397.     max_1 = min(s_x - rect_xy[0],s_y - rect_xy[1]);
  398.     max_2 = min(rect_xy[2] - s_x,rect_xy[3] - s_y);
  399.  
  400.     _vdi_attr(MD_XOR,1,1);
  401.     vsl_type(x_handle,7);
  402.  
  403.     _beg_ctrl();    
  404.     MousePointHand();
  405.  
  406.     memset(&event,0,sizeof(XEVENT));
  407.     event.ev_mflags = MU_BUTTON|MU_M1;
  408.     event.ev_mbclicks = event.ev_mm1flags = event.ev_mm1width = event.ev_mm1height = event.ev_mmokstate = 1;
  409.     event.ev_bmask = 3;
  410.  
  411.     _mouse_pos(&event.ev_mm1x,&event.ev_mm1y);
  412.  
  413.     do
  414.     {
  415.         pxy[2] = max(event.ev_mm1x,rect_xy[0]);
  416.         Min(pxy+2,rect_xy[2]);
  417.  
  418.         pxy[3] = max(event.ev_mm1y,rect_xy[1]);
  419.         Min(pxy+3,rect_xy[3]);
  420.  
  421.         if (event.ev_mmokstate)
  422.         {
  423.             dif = pxy[2] - pxy[0];
  424.             dif = (dif>0) ? min(dif,max_2) : max(dif,-max_1);
  425.             pxy[2] = pxy[0] + dif;
  426.             pxy[3] = pxy[1] + dif;
  427.         }
  428.  
  429.         draw_rubber(pxy);
  430.  
  431.         if (call_func)
  432.             call_func(pxy);
  433.  
  434.         _no_button++;
  435.         events = Event_Multi(&event);
  436.         _no_button--;
  437.  
  438.         if (events & MU_M1)
  439.         {
  440.             event.ev_mm1x = event.ev_mmox;
  441.             event.ev_mm1y = event.ev_mmoy;
  442.         }
  443.  
  444.         draw_rubber(pxy);
  445.     }
  446.     while(!(events & MU_BUTTON));
  447.  
  448.     vsl_udsty(x_handle,0x5555);
  449.     vsl_type(x_handle,1);
  450.  
  451.     MouseArrow();
  452.     _end_ctrl();    
  453.  
  454.     *r_w = pxy[2] - pxy[0];
  455.     *r_h = pxy[3] - pxy[1];
  456.  
  457.     return(TRUE);
  458. }
  459.  
  460. static void draw_rubber(reg int *pxy)
  461. {
  462.     MouseOff();
  463.     vsl_udsty(x_handle,(pxy[0] & 1) == (pxy[1] & 1) ? 21845 : (int) 43690L);
  464.     _line(pxy[0],pxy[1],pxy[0],pxy[3]);
  465.     
  466.     vsl_udsty(x_handle,(pxy[2] & 1) == (pxy[1] & 1) ? 21845 : (int) 43690L);
  467.     _line(pxy[2],pxy[1],pxy[2],pxy[3]);
  468.  
  469.     vsl_udsty(x_handle,(pxy[1] & 1) ? (int) 43690L : 21845);
  470.     _line(pxy[0],pxy[1],pxy[2],pxy[1]);
  471.     
  472.     vsl_udsty(x_handle,(pxy[3] & 1) ? (int) 43690L : 21845);
  473.     _line(pxy[0],pxy[3],pxy[2],pxy[3]);
  474.     MouseOn();
  475. }
  476.